package br.uniceub.fsw.talentos.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.talentos.vo.CargoVO;
import br.uniceub.fsw.talentos.vo.SalarioVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object da entidade TB_Cargo. Essa classe é responsável por todas as
 * operações de banco de dados relacionadas à entidade.*
 *
 *  @author Marcelo Moraes Lima - 2009
 */
public class CargoDAO extends BaseDAO<CargoVO> {

    @Override
    public void inserir(CargoVO cargo) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_Cargo( NO_Cargo, DS_Atividade) ");
        query.append("VALUES (?, ?)");


        List<?> parametros = criarParametros(cargo.getNoCargo(), cargo.getDsAtividade());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        cargo.setIdCargo(idGerado);
    }

    @Override
    public void alterar(CargoVO cargo) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_Cargo SET NO_Cargo = ?,");
        query.append("DS_Atividade = ?");
        query.append("WHERE ID_Cargo = ?");

        List<?> parametros = criarParametros(cargo.getNoCargo(),
                cargo.getDsAtividade(), cargo.getIdCargo());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(CargoVO cargo) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TB_Cargo");
        query.append("WHERE ID_Cargo = ?");

        executarAlteracao(query.toString(), criarParametros(cargo.getIdCargo()));
    }

    @Override
    public CargoVO consultarPorId(Serializable id) {

        CargoVO cargo = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_Cargo T WHERE T.ID_Cargo = ?");

        cargo = consultarUm(query.toString(), criarParametros(id));

        return cargo;
    }

    @Override
    public List<CargoVO> consultarPorExemplo(CargoVO cargo) {

        List<CargoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

       query.append("SELECT * FROM TB_Cargo T WHERE 1=1");
 //       query.append("SELECT * FROM TB_Cargo T");

        mapearQueryParaExemplo(query, cargo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    public List<CargoVO> consultarPorExemploPorParametros(CargoVO cargo, SalarioVO salario) {

        List<CargoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_Cargo T");

        if(salario != null) {
            query.append(", TB_Salario C");
        }

        query.append("WHERE 1=1");

        if(salario != null) {
            query.append("AND T.ID_Cargo = C.CD_Cargo");
        }

        mapearQueryParaExemploParaParametros(query, cargo, salario);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    @Override
    protected CargoVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        CargoVO cargo = new CargoVO();

        cargo.setIdCargo(rs.getInt("ID_Cargo"));
        cargo.setNoCargo(rs.getString("NO_Cargo"));
        cargo.setDsAtividade(rs.getString("DS_Atividade"));

     //   SalarioVO salario = new SalarioVO();

      //  salario.setIdSalario(rs.getInt("ID_Salario"));
      //  salario.setCdCargo(new Integer(rs.getInt("CD_Cargo")));
      //  salario.setVlSalario(rs.getInt("VL_Salario"));
      //  salario.setDtInicioVigencia((rs.getString("DT_InicioVigencia").equals("0000-00-00")?null:rs.getDate("DT_InicioVigencia")));
       // salario.setDtFimVigencia((rs.getString("DT_FimVigencia").equals("0000-00-00")?null:rs.getDate("DT_FimVigencia")));

        return cargo;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, CargoVO cargo) {

        if (cargo.getNoCargo() != null && !cargo.getNoCargo().isEmpty()) {
            query.append("AND T.NO_Cargo LIKE ?");
            adicionarParametro("%" + cargo.getNoCargo() + "%");
        }
    }

    protected void mapearQueryParaExemploParaParametros(ConstrutorSQL query, CargoVO cargo, SalarioVO salario) {

        if (cargo.getNoCargo() != null && !cargo.getNoCargo().isEmpty()) {
            query.append("AND T.NO_Cargo LIKE ?");
            adicionarParametro("%" + cargo.getNoCargo() + "%");
        }

        if (cargo.getDsAtividade() != null && !cargo.getDsAtividade().isEmpty()) {
            query.append("AND T.DS_Atividade LIKE ?");
            adicionarParametro("%" + cargo.getDsAtividade() + "%");
        }

        if (salario.getCdCargo() != null) {
            query.append("AND H.CD_Cargo = ?");
            adicionarParametro(salario.getCdCargo());
        }
        if (salario.getVlSalario() != null) {
            query.append("AND H.VL_Salario = ?");
            adicionarParametro(salario.getVlSalario());
        }
    }
}
